home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / GL / newton / cwd.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  3KB  |  110 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  * cwd() -- return a pointer to a static string containing the current
  19.  *          working directory.
  20.  */
  21.  
  22.  
  23. #include    <stdio.h>
  24. #include    <sys/param.h>
  25. #include    <sys/signal.h>
  26. #include    <sys/types.h>
  27. #include    <sys/sysmacros.h>
  28. #include    <sys/stat.h>
  29. #include    <dirent.h>
  30.  
  31. static struct    stat    d, dd;
  32. static struct    dirent    *dir;
  33.  
  34. static char    dot[]     = ".";
  35. static char    dotdot[] = "..";
  36. static char    name[MAXNAMLEN];
  37. static int    off;
  38. static DIR    *file;
  39.  
  40. static void cat(char *new_name);
  41.  
  42. char *
  43. cwd()
  44. {
  45.     off = -1;
  46.  
  47.     for(;;) {
  48.     if(stat(dot, &d) < 0) {
  49.         fprintf(stderr, "cwd: Cannot stat .!\n");
  50.         my_exit(2);
  51.     }
  52.     if ((file = opendir(dotdot)) == NULL) {
  53.         fprintf(stderr,"cwd: Cannot open ..\n");
  54.         my_exit(2);
  55.     }
  56.     if(fstat(file->dd_fd, &dd) < 0) {
  57.         fprintf(stderr, "cwd: Cannot stat ..!\n");
  58.         my_exit(2);
  59.     }
  60.     if(chdir(dotdot) < 0) {
  61.         fprintf(stderr, "cwd: Cannot chdir to ..\n");
  62.         my_exit(2);
  63.     }
  64.     if(d.st_dev == dd.st_dev) {
  65.         if(d.st_ino == dd.st_ino) {
  66.         cat("");
  67.         if (off < 0)
  68.             off = 0;
  69.         name[off] = '\0';
  70.         chdir(name);
  71.         return(name);
  72.         }
  73.         do
  74.         if ((dir = readdir(file)) == NULL) {
  75.             fprintf(stderr, "cwd: Read error in ..\n");
  76.             my_exit(2);
  77.         }
  78.         while (dir->d_ino != d.st_ino);
  79.     }
  80.     else do {
  81.         if((dir = readdir(file)) == NULL) {
  82.         fprintf(stderr, "cwd: Read error in ..\n");
  83.         my_exit(2);
  84.         }
  85.         stat(dir->d_name, &dd);
  86.     } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
  87.     (void)closedir(file);
  88.     cat(dir->d_name);
  89.     }
  90. }
  91.  
  92.     
  93. static void cat(char *new_name)
  94. {
  95.     register i, j;
  96.     
  97.     i = -1;
  98.     while (new_name[++i] != 0) 
  99.     if ((off+i+2) > MAXNAMLEN - 1) {
  100.         fprintf(stderr, "cwd: Pathname too long\n");
  101.         my_exit(2);
  102.     }
  103.     for(j=off+1; j>=0; --j)
  104.     name[j+i+1] = name[j];
  105.     off=i+off+1;
  106.     name[i] = '/';
  107.     for(--i; i>=0; --i)
  108.     name[i] = new_name[i];
  109. }
  110.